﻿#ifndef ENGINE_SCENEMANAGER_H
#define ENGINE_SCENEMANAGER_H

#include <string>
#include <memory>
#include <unordered_map>
#include <functional>
#include <stdexcept> // 用于 std::runtime_error
#include "Scene.h"   // 包含 Scene 定义

namespace GameEngine {

class SceneManager {
public:
    SceneManager();
    ~SceneManager();

    // 通过工厂函数注册场景类型。
    template<typename T>
    void RegisterScene(const std::string& name) {
        static_assert(std::is_base_of<Scene, T>::value, "T 必须派生自 Scene");
        if (m_sceneFactories.find(name) != m_sceneFactories.end()) {
        }
        // 下面的Lambda表达式是一个“工厂函数”。
        // 当被调用时，它会创建一个 std::shared_ptr<T> 实例。
        m_sceneFactories[name] = [this, name]() {
            auto scene = std::make_shared<T>(name);
            static_cast<Scene*>(scene.get())->m_sceneManager = this; // 传递管理器指针
            return scene;
        };
    }

    // 切换到具有给定名称的场景。
    // 如果场景未加载，它将被创建和初始化。
    void SwitchToScene(const std::string& name);

    // 更新当前活动场景。
    void UpdateCurrentScene(float deltaTime);

    // 渲染当前活动场景。
    void RenderCurrentScene();

    // 获取当前活动场景。
    std::shared_ptr<Scene> GetCurrentScene() const;

    // 按名称获取特定场景（如果不存在且已注册，则创建）
    std::shared_ptr<Scene> GetScene(const std::string& name);

    // 按名称卸载特定场景
    void UnloadScene(const std::string& name);

    // 卸载所有场景
    void UnloadAllScenes();

private:
    // m_sceneFactories 存储场景名称到其对应“工厂函数”的映射。
    std::unordered_map<std::string, std::function<std::shared_ptr<Scene>()>> m_sceneFactories;
    std::unordered_map<std::string, std::shared_ptr<Scene>> m_loadedScenes;
    std::shared_ptr<Scene> m_currentScene;
    std::string m_currentSceneName;
};

}

#endif
